from flask import Flask
import os
import logging
from logging.handlers import RotatingFileHandler
from flask_wtf.csrf import CSRFProtect
from flask_caching import Cache

# 创建扩展实例
csrf = CSRFProtect()
cache = Cache()

def create_app(config_object):
    """创建并配置Flask应用"""
    app = Flask(__name__)
    app.config.from_object(config_object)
    
    # 确保上传目录存在
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    os.makedirs(app.config['METADATA_FOLDER'], exist_ok=True)
    
    # 初始化CSRF保护 - 暂时禁用，以排除上传问题
    # csrf.init_app(app)
    app.config['WTF_CSRF_ENABLED'] = False
    
    # 初始化缓存
    cache.init_app(app)
    
    # 配置日志 - 无论是否为调试模式都启用日志
    if not os.path.exists('logs'):
        os.mkdir('logs')
    
    # 创建日志处理器
    file_handler = RotatingFileHandler('logs/app.log', maxBytes=10240, backupCount=10)
    file_handler.setFormatter(logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
    ))
    
    # 设置日志级别
    log_level = logging.DEBUG if app.debug else logging.INFO
    file_handler.setLevel(log_level)
    
    # 防止重复日志，首先移除所有已有的处理器
    app.logger.handlers = []
    
    # 添加处理器到应用日志器
    app.logger.addHandler(file_handler)
    app.logger.setLevel(log_level)
    
    # 配置根日志器，但不再添加相同的处理器
    # root_logger = logging.getLogger()
    # root_logger.setLevel(logging.DEBUG if app.debug else logging.INFO)
    # root_logger.addHandler(file_handler)
    
    # 禁用Flask的默认传播，避免日志消息传递到根日志器
    app.logger.propagate = False
    
    app.logger.info('应用启动')
    
    # 注册蓝图
    from app.routes.main import main_bp
    from app.routes.api import api_bp
    
    app.register_blueprint(main_bp)
    app.register_blueprint(api_bp)
    
    # 注册错误处理器
    register_error_handlers(app)
    
    return app

def register_error_handlers(app):
    """注册错误处理器"""
    @app.errorhandler(404)
    def not_found_error(error):
        return {'status': 'error', 'message': '资源不存在'}, 404
    
    @app.errorhandler(500)
    def internal_error(error):
        return {'status': 'error', 'message': '服务器内部错误'}, 500
    
    @app.errorhandler(400)
    def bad_request(error):
        return {'status': 'error', 'message': '请求无效'}, 400
    
    @app.errorhandler(403)
    def forbidden(error):
        return {'status': 'error', 'message': '禁止访问'}, 403 